#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <vector>
#include <functional>
#include <sys/wait.h>

int cnt = 0;
std::vector<std::function<void()>> task;

// void handler(int signo)
// {
//     std::cout << "signo: " << signo << std::endl;
//     for (auto f : task)
//     {
//         f();
//     }
//     printf("cnt: %d\n", cnt);
//     alarm(1); //一次性闹钟，超时会被自动取消
//     // exit(0);
// }

void t1()
{
    std::cout << "我是任务1" << std::endl;
}
void t2()
{
    std::cout << "我是任务2" << std::endl;
}
void t3()
{
    std::cout << "我是任务3" << std::endl;
}

void PrintPending()
{
    sigset_t block;
    sigpending(&block);
    std::cout << "pid:-> "<< getpid()<<", pending status: [" << getpid() << "]: ";
    for (int i = 31; i > 0; i--)
    {
        std::cout << sigismember(&block, i);
    }
    std::cout << std::endl;

}

void PrintBlock(sigset_t &block)
{
    std::cout << "block status: [" << getpid() << "]: ";

    for (int i = 31; i > 0; i--)
    {
        std::cout << sigismember(&block, i);
    }
    std::cout << std::endl;
}
void handler(int signo)
{
    while (true)
    {
        PrintPending();
        sleep(1);
    }
}


int main()
{
    struct sigaction act, oact;
    act.sa_flags = 0;
    act.sa_handler = handler;
    sigset_t mask;
    sigemptyset(&mask);
    sigaction(2, &act, &oact);

    while (true)
    {
        PrintBlock(mask);
        sleep(1);
    }
    return 0;
}

// int main()
// {
//     write(1,"123456",5);
//     //默认行为
//     // signal(2,SIG_DFL);
//     // signal(2,SIG_IGN);
//     // while(true);
//     //1.把2号阻塞住
//     // int cnt = 0;
//     // sigset_t block,oblock; //信号集
//     // sigemptyset(&block);
//     // sigemptyset(&oblock);
//     // sigaddset(&block,2);
//     // sigprocmask(SIG_SETMASK,&block,&oblock); //oblock输出型参数，把原来的阻塞信号集带出来
//     // //打印pending表

//     // while(true)
//     // {
//     //     signal(2,SIG_IGN);
//     //     sigset_t pending;
//     //     sigpending(&pending);
//     //     PrintPending(pending);
//     //     sleep(1);
//     //     cnt++;
//     //     if (cnt == 10)
//     //     {
//     //         std::cout << "解阻塞" << std::endl;
//     //         sigprocmask(SIG_SETMASK,&oblock,nullptr);
//     //     }
//     // }

//     ///自定义捕捉
//     // task.push_back(t1);
//     // task.push_back(t2);
//     // task.push_back(t3);
//    // pid_t id = fork();
//    // if (id == 0)
//    // {
//    //     int a = 10;
//    //     a /= 0;

//    //     exit(0);
//    // }
//    // int status = 0;
//    // waitpid(-1,&status,0);
//    // //最低7位表示退出信号，第8位表示是否有core dump标志
//    // printf("exit code : %d, core dump: %d\n", (status)&0x7f,(status>>7)&1);
//     // std::cout << "hello world" << std::endl;
//     // std::cout << "hello world" << std::endl;
//     // std::cout << "hello world" << std::endl;
//     // std::cout << "hello world" << std::endl;
//     // // signal(8,handler);
//     // int a = 10;
//     // a /= 0;

//     // // int* p = nullptr;
//     // // *p = 100;
//     // std::cout << "hello world" << std::endl;
//     // std::cout << "hello world" << std::endl;
//     // std::cout << "hello world" << std::endl;
//     // std::cout << "hello world" << std::endl;
//     // std::cout << "hello world" << std::endl;
//     // std::cout << "hello world" << std::endl;
//     // signal(14,handler);
//     // alarm(1);
//     // while(1)
//     // {
//     //     pause();
//     //     cnt++;
//     // }

//     // // kill(getpid(),9);
//     // signal(14, handler);

//     // // for (int i = 1; i <= 31; i++)
//     // // {
//     // //     signal(i,handler);
//     // // }
//     // alarm(1); //定时器

//     // while(true)
//     // {
//     //     sleep(1);
//     //     // std::cout << " helllo world " << std::endl;
//     //     alarm(1); //一次性闹钟，超时会自动被取消
//     // }
//     // while (true)
//     // {
//     //     cnt++;
//     //     //printf("cnt: %d\n", cnt++);
//     //     // std::cout << "hello world" << std::endl;
//     //     // sleep(1);
//     //     // raise(2);
//     //     // abort();
//     // }

//     return 0;
// }
